#include <GPIO.h>

/**
 * @brief 输入输出口初始化
 * 
 */
void GPIO_Init()
{
	// P0 打开 P00 P01 控制 TK24 TK25 的 GPIO 口
	//      和 P02 P03 控制 OLED显示屏 的 CLK DIO 的 GPIO 口
	P0CON |= 0x0F; // xxxx 1111 bA
	// // P1 打开 P12 P14 P15 P16 P17 控制 TK10 TK12 TK13 TK14 TK15
	P1CON |= 0xF4; // 1111 x1xx b
	// P2 打开 P22 P24 P25 P26 P27 控制 TK28 TK20 TK21 TK22 TK23 的 GPIO 口
	P2CON |= 0xF4; // 1111 x1xx b
	// P3 打开 P34 P35 P36 P37 控制 LED灯 的 GPIO 口
	//      和 P31 控制 OLED显示屏 和 WIFI模块 供电 的 GPIO 口
	//      和 P30 控制 继电器 的 GPIO 口
	P3CON |= 0xF3; // 1111 xx11 b
	// 拉高P31关闭该端口
	// P31 = 1;
}

void GPIO_setMode(uint8_t GPIO_Portx, uint8_t GPIO_Pinx, uint8_t GPIO_Mode)
{
    uint8_t PxCON;
    uint8_t PxPH;
    if(GPIO_Mode == GPIO_Mode_OutPP)
    {
        PxCON = GPIO_Pinx;
        PxPH = GPIO_Pinx;
    }
    else if(GPIO_Mode == GPIO_Mode_InPullUp)
    {
        PxCON = 0;
        PxPH = GPIO_Pinx;
    }
    else if(GPIO_Mode == GPIO_Mode_InHighImpedance)
    {
        PxCON = 0;
        PxPH = 0;
    }
    else return;
    if(GPIO_Portx & GPIO_Port0)
    {
        CLEAR_BIT(P0CON, GPIO_Pinx);
        SET_BIT(P0CON, PxCON);
        CLEAR_BIT(P0PH, GPIO_Pinx);
        SET_BIT(P0PH, PxPH);
    }
    else if(GPIO_Portx & GPIO_Port1)
    {
        CLEAR_BIT(P1CON, GPIO_Pinx);
        SET_BIT(P1CON, PxCON);
        CLEAR_BIT(P1PH, GPIO_Pinx);
        SET_BIT(P1PH, PxPH);
    }
    else if(GPIO_Portx & GPIO_Port2)
    {
        CLEAR_BIT(P2CON, GPIO_Pinx);
        SET_BIT(P2CON, PxCON);
        CLEAR_BIT(P2PH, GPIO_Pinx);
        SET_BIT(P2PH, PxPH);
    }
    else if(GPIO_Portx & GPIO_Port3)
    {
        CLEAR_BIT(P3CON, GPIO_Pinx);
        SET_BIT(P3CON, PxCON);
        CLEAR_BIT(P3PH, GPIO_Pinx);
        SET_BIT(P3PH, PxPH);
    }
    else if(GPIO_Portx & GPIO_Port4)
    {
        CLEAR_BIT(P4CON, GPIO_Pinx);
        SET_BIT(P4CON, PxCON);
        CLEAR_BIT(P4PH, GPIO_Pinx);
        SET_BIT(P4PH, PxPH);
    }
    else if(GPIO_Portx & GPIO_Port5)
    {
        CLEAR_BIT(P5CON, GPIO_Pinx);
        SET_BIT(P5CON, PxCON);
        CLEAR_BIT(P5PH, GPIO_Pinx);
        SET_BIT(P5PH, PxPH);
    }
}

void GPIO_setBit(uint8_t GPIO_Portx, uint8_t GPIO_Pinx, bool state)
{
    uint8_t Px;
    if(state == 0)
    {
        Px = 0;
    }
    else if(state == 1)
    {
        Px = GPIO_Pinx;
    }
    else return;
    if(GPIO_Portx & GPIO_Port0)
    {
        CLEAR_BIT(P0, GPIO_Pinx);
        SET_BIT(P0, Px);
    }
    else if(GPIO_Portx & GPIO_Port1)
    {
        CLEAR_BIT(P1, GPIO_Pinx);
        SET_BIT(P1, Px);
    }
    else if(GPIO_Portx & GPIO_Port2)
    {
        CLEAR_BIT(P2, GPIO_Pinx);
        SET_BIT(P2, Px);
    }
    else if(GPIO_Portx & GPIO_Port3)
    {
        CLEAR_BIT(P3, GPIO_Pinx);
        SET_BIT(P3, Px);
    }
    else if(GPIO_Portx & GPIO_Port4)
    {
        CLEAR_BIT(P4, GPIO_Pinx);
        SET_BIT(P4, Px);
    }
    else if(GPIO_Portx & GPIO_Port5)
    {
        CLEAR_BIT(P5, GPIO_Pinx);
        SET_BIT(P5, Px);
    }
}

/**
 * @brief 关闭ESP8266与OLED的电源
 * 
 */
void GPIO_turnoff_ESP8266_OLED()
{
	P31 = 1;
}

/**
 * @brief 打开ESP8266与OLED的电源
 * 
 */
void GPIO_turnon_ESP8266_OLED()
{
	P31 = 0;
}
